﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AP.LUNA.Commons;
using AP.LUNA.DataAccess;
using AP.LUNA.DataEntities;
using AP.LUNA.Exceptions;

namespace AP.LUNA.BusinessLogic
{
    public class BLAsistencia : BLAstract, IBusinessLogic<asistencia>
    {
        private LunaEntities context = null;
        public BLAsistencia()
        {
            context = GetContext();
        }

        public List<asistencia> GetAll()
        {
            throw new NotImplementedException();
        }

        public asistencia GetbyId(int id)
        {
            throw new NotImplementedException();
        }

        public List<alumnos> GetbyAsignatura(int idAsignatura, DateTime fecha)
        {
            DateTime hoy = DateTime.Today;
            int cont = 0;
            asignaturas a = context.asignaturas.FirstOrDefault(asi => asi.id == idAsignatura);
            List<alumnos> la = context.alumnos.Include("Asistencia").Where(al => al.grado == a.id_grado).ToList();
            foreach (alumnos item in la)
            {
                cont++;
                item.Index = cont;
                asistencia asi = item.asistencia.FirstOrDefault(aa => aa.Fecha == fecha);
                if (asi != null)
                    item.Asistio = asi.Asistio.Value;
                else
                    item.Asistio = false;
            }
            return la.OrderBy(al => al.primer_apellido_alumno).ThenBy(al => al.segundo_apellido_alumno).
                ThenBy(al => al.primer_nombre_alumno).ThenBy(al => al.segundo_nombre_alumno).ToList();
        }

        public asistencia GetbyId(Guid id)
        {
            throw new NotImplementedException();
        }

        public void Save(asistencia entidad)
        {
            try
            {
                context.asistencia.AddObject(entidad);
                context.SaveChanges();
            }
            catch (Exception exc)
            {
                Utils.WriteError(this.GetType().Name, exc);
                throw new LUNAExcepcion(ExceptionCode.ERROR_INESPERADO, string.Empty);
            }
        }

        public void Update(asistencia entidad)
        {
            try
            {
                context.asistencia.ApplyChanges(entidad);
                context.SaveChanges();
            }
            catch (Exception exc)
            {
                Utils.WriteError(this.GetType().Name, exc);
                throw new LUNAExcepcion(ExceptionCode.ERROR_INESPERADO, string.Empty);
            }
        }

        public void Delete(asistencia entidad)
        {
            throw new NotImplementedException();
        }

        public void DeleteAsistencia(int idAsignatural, DateTime fecha)
        {
            try
            {
                DateTime hoy = DateTime.Today;
                List<asistencia> Lista = context.asistencia.Where(aa => aa.Fecha == fecha && aa.IdAsignatura == idAsignatural).ToList();
                foreach (asistencia a in Lista)
                {
                    context.asistencia.DeleteObject(a);
                }
                context.SaveChanges();
            }
            catch (Exception exc)
            {
                Utils.WriteError(this.GetType().Name, exc);
                throw new LUNAExcepcion(ExceptionCode.ERROR_INESPERADO, string.Empty);
            }
        }
    }
}
